package org.haredot.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.haredot.dto.UserDTO;
import org.haredot.entity.User;
import org.haredot.mapper.UserMapper;
import org.haredot.service.UserService;
import org.haredot.vo.PageVo;
import org.haredot.vo.ResultVo;
import org.haredot.vo.UserVo;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper ;

    @Resource
    private PasswordEncoder passwordEncoder ;

    @Override
    public ResultVo<?> queryUsers(PageVo<UserDTO> pageVo) {

        Map<String, ?> params = pageVo.getParams();

        PageInfo<UserDTO> pageInfo = PageHelper.startPage(pageVo)
                .doSelectPageInfo(()-> userMapper.findAll(params));

        pageVo.setList(pageInfo.getList()).setTotal(pageInfo.getTotal());

        return ResultVo.ok().data(pageVo).build();
    }

    @Override
    public ResultVo<?> queryDepartsRefUserId(Long userId) {
        List<Map<String, Object>> departsRefUserId = userMapper.findDepartsRefUserId(userId);
        return ResultVo.ok().data(departsRefUserId).build();
    }

    @Override
    public ResultVo<?> bindRoles(Long userId, List<Long> roles) {

        // 删除 用户部门表中的中间数据，重新维护关系
        userMapper.deleteRolesByUserId(userId) ;

        // 批量插入 新的部门
        if (!roles.isEmpty())userMapper.batchRoleInsert(userId, roles) ;

        return ResultVo.ok().build();
    }

    @Override
    public ResultVo<?> queryPositionsRefUserId(Long userId) {
        List<Map<String, Object>> refUserId = userMapper.findPositionsRefUserId(userId);
        return ResultVo.ok().data(refUserId).build();
    }

    @Override
    public ResultVo<?> bindPosition(Long userId, List<Long> positions) {
        // 删除 用户岗位表中的中间数据，重新维护关系
        userMapper.removePositionsByUserId(userId) ;

        // 批量插入 新的岗位
        if (!positions.isEmpty())userMapper.batchPositionInsert(userId, positions) ;

        return ResultVo.ok().build();
    }

    @Override
    public ResultVo<?> queryRolesRefUserId(Long userId) {

        // 查询 角色信息 并查询 和用户相关的 内容
        List<Map<String, Object>> list = userMapper.findRolesRefUserId(userId);

        return ResultVo.ok().data(list).build();
    }

    @Override
    public ResultVo<?> saveUser(UserVo user) {

        String password = user.getPassword();
        // 加密密码
        user.setPassword(passwordEncoder.encode(password));
        // 根据用户名查询用户
        User u = userMapper.findUserByUsername(user.getUsername());

        if (u !=null) {
            return ResultVo.fail("用户名已存在").build();
        }

        userMapper.insert(user);

        // 查询默认的角色，并绑定给用户
        List<Long> roles = userMapper.findDefaultRoleIds();

        if (!roles.isEmpty()) {
            userMapper.batchRoleInsert(user.getId(), roles) ;
        }
        // 绑定 部门  和 岗位
        List<Long> departs = user.getDeparts();
        if (departs != null && !departs.isEmpty()) {
            // 绑定 用户和 部门的关系
            userMapper.batchDepartsInsert(user.getId(), departs) ;
        }

        List<Long> positions = user.getPositions() ;

        if (positions !=null && !positions.isEmpty()) {
            userMapper.batchPositionInsert(user.getId(), positions);
        }

        return ResultVo.ok().build();

    }

    @Override
    public ResultVo<?> modifyUser(UserVo user) {
        String password = user.getPassword();

        if (StringUtils.hasLength(password)) {
            user.setPassword(this.passwordEncoder.encode(password));
        }
        // 修改用户 （用户名不允许修改）
        int len = userMapper.updateByPrimaryKey(user);

        // 绑定 部门  和 岗位
        userMapper.removeDepartsByUserId(user.getId());
        List<Long> departs = user.getDeparts();
        if (departs != null && !departs.isEmpty()) {
            // 绑定 用户和 部门的关系
            userMapper.batchDepartsInsert(user.getId(), departs) ;
        }
        userMapper.removePositionsByUserId(user.getId());
        List<Long> positions = user.getPositions() ;
        if (positions !=null && !positions.isEmpty()) {
            userMapper.batchPositionInsert(user.getId(), positions);
        }

        return ResultVo.ok().build();
    }

    @Override
    public ResultVo<?> removeUser(Long userId) {
        // 查询当前用户是否是内置用户，如果是，不允许删除
        User user = userMapper.selectByPrimaryKey(userId);

        if (user.isBuilt()) {

            return ResultVo.fail("内置账户，禁止删除").build();
        }

        // 删除用户
        int len = userMapper.removeUserById(userId);

        return ResultVo.asserts(len == 1, "数据操作异常").build();
    }
}
